package com.topsec.manager.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * 调用外部命令工具类 .
 *
 * @author 赵艳生
 * @date 2018年4月23日 上午11:16:03
 */
public class CmdExecutor {
    /**
     * 执行外部命令，返回外部命令执行结果
     *
     * @param cmd 外部命令的字符串
     * @return 返回外部命令执行结果，返回的字符串结果采用UTF-8编码，换号符为"\n"
     */
    public static String exec(String cmd) throws Exception {
        return execWithUTF8(cmd);
    }

    /**
     * 执行外部命令，返回外部命令执行结果
     *
     * @param cmd 外部命令的字符串
     * @return 返回外部命令执行结果，返回的字符串结果采用UTF-8编码，换号符为"\n"
     */
    public static String execWithUTF8(String cmd) throws Exception {
        return exec(cmd, "UTF-8");
    }

    /**
     * 执行外部命令，返回外部命令执行结果
     *
     * @param cmd 外部命令的字符串
     * @return 返回外部命令执行结果，返回的字符串结果采用GBK编码，换号符为"\n"
     */
    public static String execWithGBK(String cmd) throws Exception {
        return exec(cmd, "GBK");
    }

    /**
     * 执行外部命令，返回外部命令执行结果
     *
     * @param cmd     外部命令的字符串
     * @param charset 字符集
     * @return 返回外部命令执行结果，换号符为"\n"
     */
    public static String exec(String cmd, String charset) throws Exception {
        Process proc = null;
        String result = null;
        try {
            proc = getProcess(cmd);
            result = getResult(proc, charset);
        } finally {
            if (null != proc) {
                proc.destroy();
            }
        }
        return result;
    }

    private static Process getProcess(String cmd) throws Exception {
        return Runtime.getRuntime().exec(cmd);
    }

    private static String getResult(Process proc, String charset)
            throws Exception {
        InputStream in = null;
        InputStreamReader reader = null;
        BufferedReader bufReader = null;
        StringBuffer result = new StringBuffer();
        try {
            in = proc.getInputStream();
            reader = new InputStreamReader(in, charset);
            bufReader = new BufferedReader(reader);
            while (true) {
                String line = bufReader.readLine();
                if (null == line) {
                    break;
                }
                result.append(line);
                result.append("\n");
            }
        } finally {
            try {
                if (null != bufReader) {
                    bufReader.close();
                }
                if (null != reader) {
                    reader.close();
                }
                if (null != in) {
                    in.close();
                }
            } catch (IOException e) {
            }
        }
        return result.toString();
    }
}
